
import java.io.File;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import java.net.*;
import java.io.*;
import java.util.Collections;
import java.util.Enumeration;


/***
 * Class 
 */
public class Nodo {
    

  //
  // Fields
  //
static String ip = "172.16.5.12";
static int puerto = 5555;
Socket conection = null;

DataInputStream in = null;
DataOutputStream out = null;
//static String archivo = "Party on the Floor.mp3";

static Vector<String> compartidos = new Vector<String>();
static Vector <String> directorios = new Vector<String>();

static File dir = new File("/home");
//String direcctorio_a_compartir = "/home/juancarvajal/NetBeansProjects/trunk/sadp2p/";

  //
  // Constructors
  //
  public Nodo () throws RemoteException, MalformedURLException 
  {
     
      //Naming.rebind("calc", nodo);
      //nodo.compartidos.clear();

  };
 
  public static void listar_compartidos(File aFile) {
      
      
     if(aFile.isFile()){
       System.out.println(aFile.getAbsolutePath() + "/");
       compartidos.addElement(aFile.getAbsolutePath() + "/");
    }else if (aFile.isDirectory()) {
       System.out.println(aFile.getAbsolutePath() + "/");
       compartidos.addElement(aFile.getAbsolutePath() + "/");
       File[] listOfFiles = aFile.listFiles();
        if(listOfFiles!=null) {
            for (int i = 0; i < listOfFiles.length; i++)
                  listar_compartidos(listOfFiles[i]);
        } else {
            System.out.println("No se Puede Acceder");
      }
    }
    
  }

  public void copiar_archivo(String ip, int puerto) {
        try {
            
        int filesize=6022386;
        long start = System.currentTimeMillis();
        int bytesRead;
        int current = 0;


        System.out.println("Conectando...");
        conection = new Socket(ip,puerto);


        //Send fileName to copy
        System.out.println("Digite el nombre del archivo a copiar: ");
        InputStreamReader converter = new InputStreamReader(System.in);
        BufferedReader inLine = new BufferedReader(converter);
        String fileName = inLine.readLine();
        System.out.println("Archivo: " + fileName);
        out = new DataOutputStream(conection.getOutputStream());
        out.writeUTF(fileName);
        out.flush();

        // Receive file
        System.out.println("Recibiendo...");
        byte [] mybytearray  = new byte [filesize];
        InputStream is = conection.getInputStream();
        FileOutputStream fos = new FileOutputStream("copia-"+fileName);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        bytesRead = is.read(mybytearray,0,mybytearray.length);
        current = bytesRead;

        
        do {
            bytesRead =
            is.read(mybytearray, current, (mybytearray.length-current));
            if(bytesRead >= 0) current += bytesRead;
        } while(bytesRead > -1);

            bos.write(mybytearray, 0 , current);
            bos.flush();
            long end = System.currentTimeMillis();
            System.out.println(end-start);
        bos.close();
        conection.close();
        out.close();
        System.out.println("Transferencia Completa");


        } catch (IOException ex) {
            Logger.getLogger(NodoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
  
  public static void main(String args[]) throws SocketException, IOException, NotBoundException 
  {
      
      
        JFileChooser chooser = new JFileChooser();
        chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        chooser.showDialog(null,"Compartir");
        File archivo_seleccionado;
        archivo_seleccionado = chooser.getSelectedFile();
        System.out.println("Directorio Seleccionado");
        dir = new File(archivo_seleccionado.toString());
        InetAddress host_address = null;

        //Lanza la ejecucion del Hilo Para Escuchar Peticiones Externas
        HiloNodo hn = new HiloNodo(puerto);
        hn.start();
        
       
        FileReader fr = null;
        BufferedReader bf = null;
        String direccion_ip = null;
        String spuerto = null;
    
      
        try {
            fr = new FileReader("config.txt");
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ServidorP2PImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        bf = new BufferedReader(fr);
        
        direccion_ip = bf.readLine();
        spuerto = bf.readLine();
        
        System.out.println();
        System.out.println(direccion_ip);
        System.out.println(spuerto);
  
            //displayInterfaceInformation(netint);
            //Adquirir Ip De Nodo
            
            //System.out.println(host_address.getHostAddress());
        
            listar_compartidos(dir);
            directorios = compartidos;
            String direccion_actual = "";
            String server = args[0];
            System.out.println("Direccion Del Servidor");
            System.out.println(server);
            IServidorP2P cliente = null;
            cliente = (IServidorP2P) Naming.lookup("rmi://" + args[0] +"/calc");
            String mensaje = null;
            Scanner in=new Scanner(System.in);
            String parametro= null;
            
            
            cliente.registrar(directorios,direccion_ip+":"+spuerto);
            System.out.println("Registro Completado");
            System.out.println("Ingrese Comandos");
            String comando = null;
         
            
            while (true){
                
                mensaje=in.nextLine();
                StringTokenizer parametros = new StringTokenizer(mensaje, " ");
                comando = parametros.nextToken();
                
                if (comando.equals("ls")){
                    
                    String[] consultar_directorio = cliente.consultar_directorio(direccion_actual);            
                    for (int i = 0; i < consultar_directorio.length; i++) {
                        System.out.println(consultar_directorio[i]);
                    }
                }else 
                    if (comando.equals("cd"))
                    //if (mensaje.regionMatches(0, "cd ", 0, 2))
                    {
                        //parametros.nextToken();
                        if (parametros.hasMoreTokens())
                        {   
                            parametro=parametros.nextToken();
                            if (parametro.equals(".."))
                            {
                                direccion_actual = "";
                            }else
                                if (cliente.validar_directorio(direccion_actual + parametro +"/")){    
                                    direccion_actual= direccion_actual + parametro +"/";
                            }else
                                {
                                    System.out.println("Direccion Incorrecta");
                                }
                                    
                                
                        }
                        
                        
                    }
                if(comando.equals("cp")){
                    
                    
                    
                    Nodo nodo = new Nodo();
                    int puerto_remoto =  Integer.parseInt(cliente.obtener_ip(direccion_actual));
                    nodo.copiar_archivo(cliente.obtener_ip(direccion_actual),puerto_remoto);
                }
                System.out.println(direccion_actual);
            
            }
            
       
      
  }

}
